import 'package:mysql1/mysql1.dart';
import 'package:flutter/foundation.dart';

class DatabaseService {
  final ConnectionSettings settings = ConnectionSettings(
    host: 'localhost',
    port: 3306,
    user: 'root', // ئۆزگەرتىش كېرەك بولسا، ئۆزگەرتىڭ
    password: 'root', // ئۆزگەرتىش كېرەك بولسا، ئۆزگەرتىڭ
    db: 'tijarat_sandan',
  );

  Future<bool> createUserInfoTable() async {
    try {
      final conn = await MySqlConnection.connect(settings);

      // ساندان جەدۋىلى بار-يوقلۇقىنى تەكشۈرۈش
      final tables = await conn.query(
          "SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'userinfo'",
          [settings.db]);
      final tableExists = tables.first['count'] > 0;

      if (tableExists) {
        debugPrint('userinfo جەدۋىلى مەۋجۇت');
        await conn.close();
        return true;
      } else {
        debugPrint('userinfo جەدۋىلى مەۋجۇت ئەمەس، لۇتفەن قۇرۇپ چىقىڭ');
        await conn.close();
        return false;
      }
    } catch (e) {
      debugPrint('ساندان جەدۋىلى ئۇلىنىش خاتالىقى: $e');
      throw Exception('ساندان جەدۋىلى ئۇلىنىش خاتالىقى: $e');
    }
  }

  Future<bool> login(String username, String password) async {
    try {
      final conn = await MySqlConnection.connect(settings);
      final results = await conn.query(
        'SELECT * FROM userinfo WHERE Username = ? AND Password = ?',
        [username, password],
      );

      await conn.close();
      return results.isNotEmpty;
    } catch (e) {
      debugPrint('كىرىش خاتالىقى: $e');
      throw Exception('كىرىش خاتالىقى: $e');
    }
  }

  Future<bool> addUser(String username, String password,
      [String? email]) async {
    try {
      final conn = await MySqlConnection.connect(settings);

      // ئالدى بىلەن بۇ ئىشلەتكۈچى بار-يوقلۇقىنى تەكشۈرەيلى
      final existingUser = await conn.query(
        'SELECT * FROM userinfo WHERE Username = ?',
        [username],
      );

      if (existingUser.isNotEmpty) {
        await conn.close();
        return false; // ئىشلەتكۈچى ئىسمى ئاللىقاچان ئىشلىتىلگەن
      }

      // يېڭى ئىشلەتكۈچى قوشايلى
      // ئىشلەتكۈچى نومۇرى (UserID) ئاپتوماتىك زىيادىلانمىغاچقا، ئەڭ چوڭ قىممەتنى تېپىپ بىر قوشايلى
      final maxIdResult =
          await conn.query('SELECT MAX(UserID) as maxId FROM userinfo');
      final maxId = maxIdResult.first['maxId'] as int? ?? 0;
      final newId = maxId + 1;

      // يېڭى ئىشلەتكۈچى قوشۇش
      await conn.query(
        'INSERT INTO userinfo (UserID, Username, Password, Email) VALUES (?, ?, ?, ?)',
        [newId, username, password, email],
      );

      await conn.close();
      return true;
    } catch (e) {
      debugPrint('ئىشلەتكۈچى قوشۇش خاتالىقى: $e');
      throw Exception('ئىشلەتكۈچى قوشۇش خاتالىقى: $e');
    }
  }

  /// ئىشلەتكۈچى نامى ياكى ئېلخەت بويىچە ئىشلەتكۈچىنى ئىزدەش
  Future<Map<String, dynamic>?> findUserByUsernameOrEmail(
      String usernameOrEmail) async {
    try {
      final conn = await MySqlConnection.connect(settings);
      final results = await conn.query(
        'SELECT * FROM userinfo WHERE Username = ? OR Email = ?',
        [usernameOrEmail, usernameOrEmail],
      );

      await conn.close();

      if (results.isNotEmpty) {
        return {
          'UserID': results.first['UserID'],
          'Username': results.first['Username'],
          'Email': results.first['Email'],
        };
      } else {
        return null;
      }
    } catch (e) {
      debugPrint('ئىشلەتكۈچى ئىزدەش خاتالىقى: $e');
      throw Exception('ئىشلەتكۈچى ئىزدەش خاتالىقى: $e');
    }
  }

  /// پارولنى يېڭىلاش
  Future<bool> updatePassword(
      String usernameOrEmail, String newPassword) async {
    try {
      final conn = await MySqlConnection.connect(settings);

      // ئالدى بىلەن ئىشلەتكۈچىنى تېپىش
      final user = await findUserByUsernameOrEmail(usernameOrEmail);

      if (user == null) {
        await conn.close();
        throw Exception('بۇ ئىشلەتكۈچى نامى ياكى ئېلخەت تېپىلمىدى');
      }

      // پارولنى يېڭىلاش
      final results = await conn.query(
        'UPDATE userinfo SET Password = ? WHERE UserID = ?',
        [newPassword, user['UserID']],
      );

      await conn.close();
      return results.affectedRows! > 0;
    } catch (e) {
      debugPrint('پارول يېڭىلاش خاتالىقى: $e');
      throw Exception('پارول يېڭىلاش خاتالىقى: $e');
    }
  }
}
